<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>未向下兼容的改变</title>

 </head>
 <body><div class="manualnavbar" style="text-align: center;">
 <div class="prev" style="text-align: left; float: left;"><a href="migration5.changes.html">PHP 5 中有哪些改变</a></div>
 <div class="next" style="text-align: right; float: right;"><a href="migration5.cli-cgi.html">CLI 和 CGI</a></div>
 <div class="up"><a href="migration5.html">从 PHP 4 移植到 PHP 5</a></div>
 <div class="home"><a href="index.html">PHP Manual</a></div>
</div><hr /><div id="migration5.incompatible" class="section">
   <h2 class="title">未向下兼容的改变</h2>
   <p class="para">
    尽管大部分 PHP 4 的代码应该不用修改就能运行，还是应该留意以下不向下兼容的改变：
   </p>
   <ul class="itemizedlist">
    <li class="listitem">
     <span class="simpara">
      有了一些<a href="reserved.keywords.html" class="link">新关键字</a>。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <span class="function"><a href="function.strrpos.html" class="function">strrpos()</a></span> 和 <span class="function"><a href="function.strripos.html" class="function">strripos()</a></span>
      如今使用整个字符串作为 needle。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      非法使用字符串偏移量会导致 <strong><code>E_ERROR</code></strong> 而不是
      <strong><code>E_WARNING</code></strong>。一个非法使用的例子：<em>$str = &#039;abc&#039;; unset($str[0]);</em>.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <span class="function"><a href="function.array-merge.html" class="function">array_merge()</a></span> 被改成只接受数组。如果传递入非数组变量，对每个此类参数都会发出一条
      <strong><code>E_WARNING</code></strong> 信息。要小心因为你的代码有可能疯狂发出
      <strong><code>E_WARNING</code></strong>。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      PATH_TRANSLATED 服务器变量在 Apache2 SAPI 中不再暗中设定，这和 PHP 4
      中的情形相反，如果 Apache 没产生此值则其被设为和
      SCRIPT_FILENAME 服务器变量一样的值。此修改是为了遵守
      <a href="http://www.faqs.org/rfcs/rfc3875" class="link external">&raquo;&nbsp;CGI 规范</a>。更多信息见 <a href="http://bugs.php.net/23610" class="link external">&raquo;&nbsp;bug #23610</a>，并参考手册中
      <a href="reserved.variables.server.html" class="link">$_SERVER[&#039;PATH_TRANSLATED&#039;]</a>
      的说明。此问题也影响到 PHP &gt;= 4.3.2 的版本。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <a href="ref.tokenizer.html" class="link">Tokenizer</a> 扩展不再定义
      <strong><code>T_ML_COMMENT</code></strong> 常量。如果把
      error_reporting 设为 <strong><code>E_ALL</code></strong>，PHP
      将产生一条消息。尽管 <strong><code>T_ML_COMMENT</code></strong>
      从来都没用到过，还是在 PHP 4 中定义了。在 PHP 4 和 PHP 5
      中 // 和 /* */ 都被解析为 <strong><code>T_COMMENT</code></strong>
      常量。但是 PHPDoc 风格的注释 /** */，自 PHP 5 开始被
      PHP 解析，被识别为 <strong><code>T_DOC_COMMENT</code></strong>。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      如果 <a href="ini.core.html#ini.variables-order" class="link">variables_order</a>
      包括“S”，$_SERVER 应该带有 argc 和 argv 被产生。如果用户特别配制系统不创建
      $_SERVER，那此变量当然就不存在了。改变的地方是不管 <a href="ini.core.html#ini.variables-order" class="link">variables_order</a> 怎么设定，在
      CLI 版本中 argc 和 argv 总是可用的。本来 CLI
      版不是总会产生全局变量 $argc 和 $argv 的。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      没有属性的对象不再被当成“empty”。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      有些情况下类必须在使用前被定义。这仅在使用了一些 PHP 5
      的新特性（例如 <a href="language.oop5.interfaces.html" class="link">interfaces</a>）的时候发生。其它情况下行为都没变。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <span class="function"><a href="function.get-class.html" class="function">get_class()</a></span>，<span class="function"><a href="function.get-parent-class.html" class="function">get_parent_class()</a></span>
      和 <span class="function"><a href="function.get-class-methods.html" class="function">get_class_methods()</a></span>
      如今返回的类／方法名和定义时的名字一致（区分大小写），对于依赖以前行为（类／方法名总是返回小写的）的老脚本可能产生问题。一个可能的解决方法是在脚本中搜索所有这些函数并使用
      <span class="function"><a href="function.strtolower.html" class="function">strtolower()</a></span>。
     </span>
     <span class="simpara">
      区分大小写的改变也适用于<a href="language.constants.predefined.html" class="link">魔术常量</a>
      <strong><code>__CLASS__</code></strong>，<strong><code>__METHOD__</code></strong>
      和 <strong><code>__FUNCTION__</code></strong>。其值都会严格按照定义时的名字返回（区分大小写）。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <span class="function"><a href="function.ip2long.html" class="function">ip2long()</a></span> 在传递入一个非法
      IP 作为参数时返回 <strong><code>FALSE</code></strong>，不再是
      <em>-1</em>。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      如果有函数定义在包含文件中，则这些函数可以在主文件中使用而与是否在
      <span class="function"><a href="function.return.html" class="function">return</a></span> 指令之前还是之后无关。如果文件被包含两次，PHP 5
      会发出致命错误，因为函数已经被定义，而 PHP 4
      不管这个。因此推荐使用 <span class="function"><a href="function.include-once.html" class="function">include_once</a></span>
      而不要去检查文件是否已被包含以及在包含文件中有条件返回。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <span class="function"><a href="function.include-once.html" class="function">include_once</a></span> 和 <span class="function"><a href="function.require-once.html" class="function">require_once</a></span>
      在 Windows 下先将路径规格化，因此包含
      A.php 和 a.php 只会把文件包含一次。
     </span>
    </li>
   </ul>

   <p class="para">
    <div class="example" id="example-5498">
     <p><strong>Example #1 
      <span class="function"><a href="function.strrpos.html" class="function">strrpos()</a></span> 和 <span class="function"><a href="function.strripos.html" class="function">strripos()</a></span>
      如今用整个字符串作为 needle
     </strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">strrpos</span><span style="color: #007700">(</span><span style="color: #DD0000">'ABCDEF'</span><span style="color: #007700">,</span><span style="color: #DD0000">'DEF'</span><span style="color: #007700">));&nbsp;</span><span style="color: #FF8000">//int(3)<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">strrpos</span><span style="color: #007700">(</span><span style="color: #DD0000">'ABCDEF'</span><span style="color: #007700">,</span><span style="color: #DD0000">'DAF'</span><span style="color: #007700">));&nbsp;</span><span style="color: #FF8000">//bool(false)<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
     </div>

    </div>
   </p>
   <p class="para">
    <div class="example" id="example-5499">
     <p><strong>Example #2 没有属性的对象不再被当成“empty”</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">test&nbsp;</span><span style="color: #007700">{&nbsp;}<br /></span><span style="color: #0000BB">$t&nbsp;</span><span style="color: #007700">=&nbsp;new&nbsp;</span><span style="color: #0000BB">test</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(empty(</span><span style="color: #0000BB">$t</span><span style="color: #007700">));&nbsp;</span><span style="color: #FF8000">//&nbsp;echo&nbsp;bool(false)<br /><br /></span><span style="color: #007700">if&nbsp;(</span><span style="color: #0000BB">$t</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;Will&nbsp;be&nbsp;executed<br /></span><span style="color: #007700">}<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
     </div>

    </div>
   </p>
   <p class="para">
    <div class="example" id="example-5500">
     <p><strong>Example #3 有些情况下类必须在使用之前定义</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">//works&nbsp;with&nbsp;no&nbsp;errors:<br /></span><span style="color: #0000BB">$a&nbsp;</span><span style="color: #007700">=&nbsp;new&nbsp;</span><span style="color: #0000BB">a</span><span style="color: #007700">();<br />class&nbsp;</span><span style="color: #0000BB">a&nbsp;</span><span style="color: #007700">{<br />}<br /><br /><br /></span><span style="color: #FF8000">//throws&nbsp;an&nbsp;error:<br /></span><span style="color: #0000BB">$a&nbsp;</span><span style="color: #007700">=&nbsp;new&nbsp;</span><span style="color: #0000BB">b</span><span style="color: #007700">();<br /><br />interface&nbsp;</span><span style="color: #0000BB">c</span><span style="color: #007700">{<br />}<br />class&nbsp;</span><span style="color: #0000BB">b&nbsp;</span><span style="color: #007700">implements&nbsp;</span><span style="color: #0000BB">c&nbsp;</span><span style="color: #007700">{<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
     </div>

    </div>
   </p>
  </div><hr /><div class="manualnavbar" style="text-align: center;">
 <div class="prev" style="text-align: left; float: left;"><a href="migration5.changes.html">PHP 5 中有哪些改变</a></div>
 <div class="next" style="text-align: right; float: right;"><a href="migration5.cli-cgi.html">CLI 和 CGI</a></div>
 <div class="up"><a href="migration5.html">从 PHP 4 移植到 PHP 5</a></div>
 <div class="home"><a href="index.html">PHP Manual</a></div>
</div></body></html>
